#include <vector>
#include <iostream>
#include <unordered_map>
using namespace std;
class Solution
{
public:
    vector<int> findAnagrams(string s, string p)
    {
        unordered_map<char, int> cntMap;
        vector<int> ans;
        for (auto e : p)
            cntMap[e]++;
        int num = cntMap.size();
        // 构建哈希map
        int left = 0, right = 0, n = s.size();
        for (; right < n; ++right)
        {
            if (!num)
                ans.push_back(left);
            // 如果当前元素不是p的元素之一，那中间全部都没用了
            if (cntMap.find(s[right]) == cntMap.end())
            {
                // 如果当前right所指的数left一个都没有，那么之后就不可能会有
                while (left < right)
                    cntMap[s[left++]]++;
                ++left;
                num = cntMap.size();
                // cout << "1:" << left << endl;
            }
            // 如果当前元素是p元素之一，但是前面已经出现了足够的元素，那就一直删去前面存在的元素
            else if (cntMap[s[right]] == 0)
            {
                while (s[left] != s[right])
                {
                    cntMap[s[left]]++;
                    if (cntMap[s[left]] == 1)
                        ++num;
                    left++;
                }
                ++left;
                // cout << "2:" << left << endl;
            }
            // 如果是，并且还有雨量，用掉一个余量
            else
            {
                // cout << "right:" << right << endl;
                cntMap[s[right]]--;
                if (cntMap[s[right]] == 0)
                    --num;
            }
        }
        if (!num)
            ans.push_back(left);
        return ans;
    }
};